package maps

import "go-commons/slices"

// MapKeyExists 判断map是否包含某个key
// M 判断map的类型
// 符号 ~ 是 Go 1.18+ 引入的 类型约束，表示 M 必须是一个类型为 map[K]V 的类型，或者是一个与 map[K]V 结构兼容的类型。
// K map对应的Key V map对应的value
// 返回true和false true：存在，false：不存在
func MapKeyExists[M ~map[K]V, K comparable, V any](m M, k K) bool {
	_, ok := m[k]
	return ok
}

// DelMapByKeys 批量删除map指定的keys
func DelMapByKeys[M ~map[K]V, K comparable, V any](m M, keys []K) {
	for _, k := range keys {
		delete(m, k)
	}
}

// SplitMapWithKeys 将map拆分为两个map m1包含指定keys,m2不包含指定keys
func SplitMapWithKeys[M ~map[K]V, K comparable, V any](m M, keys []K) (M, M) {
	m1, m2 := make(map[K]V), make(map[K]V)
	for key, val := range m {
		if slices.Contains[K](keys, key) {
			m1[key] = val
		} else {
			m2[key] = val
		}
	}
	return m1, m2
}
